package com.example.PDFdemo.pdffinalplan;

import cn.hutool.core.codec.Base64Decoder;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Finalyplan {
    public static void  addText(String oldFilePath, String newFilePath, List<PDFModel> models) throws DocumentException, IOException {
        PdfReader reader = new PdfReader(oldFilePath);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(newFilePath));
        for (PDFModel model : models) {
            if (model.getImgUrl() == null) {
                //设置基础字体
                String fontPath = "static/" + model.getFontName() + ".ttf";
                //颜色16进制转RGB
                Map<String, Integer> RGB = PDFUtil.hex2RGB(model.getColor());
                //创建基础字体对象
                BaseFont baseFont = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
                //创建颜色对象
                BaseColor color = new BaseColor(RGB.get("red"), RGB.get("green"), RGB.get("blue"));
                //根据基础字体创建字体，并设置字体大小
                Font font = new Font(baseFont, model.getFontSize());
                //设置字体颜色
                font.setColor(color);
                //设置字体样式   加粗 0不加粗，1加粗，默认不加粗   倾斜 0不倾斜，2倾斜，默认不倾斜
                font.setStyle(model.getFontBold() + model.getFontIncline());
                /*
                添加文本
                */
                PdfContentByte over = stamper.getOverContent(model.getPageNumber());
                //创建列文本对象
                ColumnText columnText = new ColumnText(over);
                /*
                使用表格+单元格的形式实现文字在垂直方向的位置设置
                */
                //获取页面大小
                Rectangle pageRect = new Rectangle(reader.getPageSizeWithRotation(model.getPageNumber()));
                //页面的宽
                float x = pageRect.getRight();
                //页面的长
                float y = pageRect.getTop();
                //创一个与文本框大小相同的矩形
                Rectangle textRect = new Rectangle(model.getX() * x, model.getY() * y, model.getX() * x + model.getW() * x, model.getY() * y + model.getH() * y);
                //创建段落，根据字体样式渲染文本
                Paragraph paragraph =new Paragraph(model.getContent(), font);
                //创建一个一列的表格
                PdfPTable table = new PdfPTable(1);
                //设置表格宽度，与文本框宽度一致
                table.setTotalWidth(textRect.getWidth());
                //设置单元格在表格中的宽度占比，是单元格填满整个表格，默认为80%
                table.setWidthPercentage(100);
                //跨页处理，false：只显示文本框内的文字，超出部分不显示；true：文字超出文本框全部不显示
                table.setSplitLate(false);
                //创建单元格，讲段落添加到单元格中
                PdfPCell cell = new PdfPCell(paragraph);
                //设置单元格的高度，与文本框高度一致
                cell.setFixedHeight(textRect.getHeight());
                //设置水平位置
                cell.setHorizontalAlignment(model.getHorizontal());
                //设置垂直位置
                cell.setVerticalAlignment(model.getVertical());
                //消除表格边框
                cell.disableBorderSide(15);
                //把单元格添加表格中
                table.addCell(cell);
                //设置列文本的大小，与文本框相同
                columnText.setSimpleColumn(textRect);
                //讲表格作为元素添加的文本列中
                columnText.addElement(table);
                //讲列文本添加到PDF上
                columnText.go();
            } else {
                PdfContentByte over = stamper.getOverContent(model.getPageNumber());
                //创建矩形
                Rectangle rect = new Rectangle(reader.getPageSizeWithRotation(model.getPageNumber()));
                float x = rect.getRight();
                float y = rect.getTop();
                //获取图片
                Base64Decoder decoder = new Base64Decoder();
                String oldBase = "";                String newBase = oldBase.substring(oldBase.lastIndexOf(",")+1);
                byte[] byteImage = decoder.decode(newBase);
                Image image = Image.getInstance(byteImage);
                over.saveState();
                PdfGState state = new PdfGState();
                // 设置填充透明度
                state.setFillOpacity(1.0f);
                over.setGState(state);
                // pdf 图层图片渲染
                over.addImage(image, x * model.getW(), 0f, 0f, y * model.getH(), model.getX() * x, model.getY() * y);
                over.restoreState();
            }
        }
        stamper.close();
        reader.close();
    }
    //十六进制转RGB
    public static Map<String, Integer> hex2RGB(String hexStr){
        if(hexStr != null && !"".equals(hexStr) && hexStr.length() == 7){
            Map<String, Integer> rgb = new HashMap();
            rgb.put("red", Integer.valueOf(hexStr.substring( 1, 3 ), 16));
            rgb.put("green", Integer.valueOf(hexStr.substring( 3, 5 ), 16));
            rgb.put("blue", Integer.valueOf(hexStr.substring( 5, 7 ), 16));
            return rgb;
        }
        return null;
    }

    public static List<PDFModel> modelList(String signJson) {
        return null;
    }
}
